/******************************************************************************************
 *   Zegar czasu rzeczywistego PCF8583 (pcf8583.c)
 *																						 
 *   Utworzono: 07-12-2010																	 
 *       Autor: czopas																	 
 *****************************************************************************************/

/******************************************************************************************
 *	Deklaracje dołączanych plików nagłówkowych i bibliotek								 *
 *****************************************************************************************/
#include "pcf8583.h"

/******************************************************************************************
 *	Deklaracje funkcji															 		 *
 *****************************************************************************************/

/*
 * 	Funkcja zapisu bajtu do PCF8583
 * 	Argument: address - adres komórki pamięci PCF8583, byte - bajt danych
 */
void pcf8583_write_byte(char address, char byte){
	twi_start();
	twi_write_byte(PCF8583);
	twi_write_byte(address);
	twi_write_byte(byte);
    //i2c_stop();
}/* pcf8583_write_byte */

/*
 * 	Funkcja zapisu bajtu w formacie BCD do PCF8583
 * 	Argument: address - adres komórki pamięci PCF8583, byte - bajt danych
 */
void pcf8583_write_bcd_byte(char address, char byte){
	char dziesiatki, jednosci, bajt;
	dziesiatki = byte/10;
	jednosci = byte%10;
	bajt = (dziesiatki << 4) | jednosci;

	pcf8583_write_byte(address, bajt);
}/* pcf8583_write_bcd_byte */

/*
 * 	Funkcja odczytu bajtu z komórki pamięci PCF8583
 * 	Argument: address - adres komórki pamięci PCF8583
 *	Wynik: bajt danych z wybranej komórki pamięci
 */
uint8_t pcf8583_read_byte(uint8_t address, uint8_t ack){
	uint8_t temp = 0;

	twi_start();
	twi_write_byte(PCF8583);
	twi_write_byte(address);
	twi_start();
	twi_write_byte(PCF8583 + 1);
	temp = twi_read_byte(ack);
	twi_stop();

	return temp;
}/* pcf8583_read_byte */

/*
 * 	Funkcja odczytu bajtu w formacie BCD z PCF8583
 * 	Argument: address - adres komórki pamięci PCF8583
 * 	Wynik: bajt danych w formacie BCD z wybranej komórki pamięci
 */
char pcf8583_read_bcd_byte(char address){
    char ret;
	ret = pcf8583_read_byte(address, NOACK);

    ret = (((ret & 0xF0) >> 4)*10)+(ret & 0x0F);

    return ret;
}/* pcf8583_read_bcd_byte */

/*
 * 	Funkcja pobierania czasu z PCF8583
 * 	Argument: hour, min, sec, hsec - setne częsci sekundy
 */
void pcf8583_get_time(char *hour, char *min, char *sec, char *hsec){
	  *hsec = pcf8583_read_bcd_byte(0x01);
	  *sec = pcf8583_read_bcd_byte(0x02);
	  *min = pcf8583_read_bcd_byte(0x03);
	  *hour = pcf8583_read_bcd_byte(0x04);
}/* pcf8583_get_time */

/*
 * 	Funkcja pobierania daty z PCF8583
 * 	Argument: day, month, year
 */
void pcf8583_get_date(char *day, char *month, unsigned int *year){
	*day = (pcf8583_read_bcd_byte(0x05)) & 0x3F;
	*month = (pcf8583_read_byte(0x06, NOACK)) /*& 0x1F*/;
	*year = 2000 + (pcf8583_read_bcd_byte(0x16));
}/* pcf8583_get_date */

/*
 * 	Funkcja ustawiania czasu w PCF8583
 * 	Argument: hour, min, sec, hsec
 */
void pcf8583_set_time(char hour, char min, char sec, char hsec){
	pcf8583_write_bcd_byte(0x01, hsec);
	pcf8583_write_bcd_byte(0x02, sec);
	pcf8583_write_bcd_byte(0x03, min);
	pcf8583_write_bcd_byte(0x04, hour);
}/* pcf8583_set_time */

/*
 * 	Funkcja ustawiania daty w PCF8583
 * 	Argument: day, month, year
 */
void pcf8583_set_date(char day, char month, char year){
	pcf8583_write_bcd_byte(0x05, day);
	pcf8583_write_bcd_byte(0x06, month);
	pcf8583_write_byte(0x16, year);
}/* pcf8583_set_date */

/******************************************************************************************
 *	Koniec pliku pcf8583.c                                                            
 *****************************************************************************************/
